package facade.Gae;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import dao.implementations.postgresql.UsuarioDB;
import dao.implementations.postgresql.Alumno.AlumnoDB;
import dao.implementations.postgresql.Gae.GaeDB;
import dao.implementations.postgresql.Producto.ProductoDB;
import dao.implementations.postgresql.Reporte.ReporteDB;
import dao.implementations.postgresql.Socio.PautaEvaluacionDB;
import dao.interfaces.IUsuario;
import dao.interfaces.Alumno.IAlumno;
import dao.interfaces.Gae.IGae;
import dao.interfaces.Producto.IProducto;
import dao.interfaces.Reporte.IReporte;
import dao.interfaces.Socio.IPautaEvaluacion;
import dao.transferObjects.UsuarioTO;
import dao.transferObjects.Administrador.ProyectoTO;
import dao.transferObjects.Gae.AlumnoTO;
import dao.transferObjects.Gae.CursoTO;
import dao.transferObjects.Gae.GaeTO;
import dao.transferObjects.Socio.PautaEvaluacionTO;
import dao.transferObjects.Socio.SocioTO;
import facade.FacadeBase;

public class FacadeGae extends FacadeBase{

	public int crearGae(GaeTO gae, UsuarioTO usuario)
	{
		int resp = -1;
		this.connection.setAutoCommit(false);
		
		IUsuario usuarioDB = new UsuarioDB(this.connection.getConnection());
		//IDocente docenteDB = new DocenteDB(this.connection.getConnection());
		IGae gaeDB = new GaeDB(this.connection.getConnection());
		IAlumno alumnoDB = new AlumnoDB(this.connection.getConnection());
		
		//Primero registramos la cuenta de usuario
		resp = usuarioDB.registrarUsuario(usuario);
		
		//Asignamos el id_gae al GAE a crear
		gae.setId_gae(gaeDB.obtenerSgteIDGae());
		
		//Segundo creamos el GAE
		if(resp > 0){
			resp = gaeDB.crearGAE(gae);
		}
		//Tercero establecimos a un alumno del gae como representante
		//(esto asignandole al alumno representante, el rut_gae)
		if(resp > 0){
			resp = alumnoDB.asignarAlumnoRepresentante(gae);
			//resp = gaeDB.asignarAlumnoRepresentant(gae);
		}
		//Cuarto asocioamos los alumnos al gae 
		//(esto pasandole a cada integrante el id_gae)
		if(resp > 0){
			AlumnoTO alumno = new AlumnoTO();
			for(int i=0;i<gae.getListaAlumnosGAE().size();i++){
				alumno = gae.getListaAlumnosGAE().get(i);
				resp = alumnoDB.asignarAlumnoGae(gae, alumno);
				//resp = gaeDB.asignarAlumnoGae(gae, alumno);
				if(resp < 1){
					resp = -1;
					break;
				}
			}
		}
		
		if(resp > 0){
			this.connection.commit();
		}else{
			this.connection.rollback();
		}
		try{
			this.connection.getConnection().close();
		}catch (SQLException e){
			e.printStackTrace();
		}
		return resp;
	}

	public int modificarGae(GaeTO gaeOriginal, UsuarioTO usuarioOrignal, GaeTO gaeNuevo, UsuarioTO usuarioNuevo)
	{
		int resp = -1;
		this.connection.setAutoCommit(false);
		
		IUsuario usuarioDB = new UsuarioDB(this.connection.getConnection());
		IProducto productoDB = new ProductoDB(this.connection.getConnection());
		IReporte reporteDB = new ReporteDB(this.connection.getConnection());
		IGae gaeDB = new GaeDB(this.connection.getConnection());
		IAlumno alumnoDB = new AlumnoDB(this.connection.getConnection());
		IPautaEvaluacion pautaEvaluacionDB = new PautaEvaluacionDB(this.connection.getConnection());
		
		
		if(usuarioOrignal.getRut() != usuarioNuevo.getRut()){
			
			//creamos nuevo usuario
			resp = usuarioDB.registrarUsuario(usuarioNuevo);
			
			//creamos nuevo gae
			gaeNuevo.setRut_gae(usuarioNuevo.getRut());
			resp = gaeDB.crearGAE(gaeNuevo);
			
			//eliminamos alumnos pretenecientes al gaeOriginal
			if(resp >= 0){
				for(int i=0;i<gaeOriginal.getListaAlumnosGAE().size();i++){
					resp = alumnoDB.eliminarAlumno(gaeOriginal.getListaAlumnosGAE().get(i));
					if(resp < 1){
						resp = -1;
						break;
					}
				}
			}
			
			//insertamos alumnos eliminados
			if(resp >= 0){
				for(int i=0;i<gaeOriginal.getListaAlumnosGAE().size();i++){
					gaeOriginal.getListaAlumnosGAE().get(i).setId_curso(gaeOriginal.getId_curso());
					resp = alumnoDB.insertarAlumno(gaeOriginal.getListaAlumnosGAE().get(i));
					if(resp < 1){
						resp = -1;
						break;
					}
				}
			}
			
			//asociamos alumnos al gae
			if(resp >= 0){
				for(int i=0;i<gaeNuevo.getListaAlumnosGAE().size();i++){
					gaeNuevo.getListaAlumnosGAE().get(i).setId_curso(gaeOriginal.getId_curso());
					resp = alumnoDB.asignarAlumnoGae(gaeNuevo, gaeNuevo.getListaAlumnosGAE().get(i));
					if(resp < 1){
						resp = -1;
						break;
					}
				}
			}
			
			//asociamos alumno representante
			if(resp > 0){
				resp = alumnoDB.asignarAlumnoRepresentante(gaeNuevo);
			}
			
			
			//re-asociamos los productos del gaeOriginal al gaeNuevo 
			if(resp > 0){
				resp = productoDB.reAsociarProducto(gaeOriginal, gaeNuevo);
			}
			
			//re-asociamos los reportes del gaeOriginal al gaeNuevo 
			if(resp >= 0){
				resp = reporteDB.reAsociarReporte(gaeOriginal, gaeNuevo);
			}
			
			//re-asociamos la pauta de evaluacion del gaeOriginal al gaeNuevo
			if(resp >=0){
				resp = pautaEvaluacionDB.reAsignarPautaEvaluacionGAE(gaeOriginal, gaeNuevo);
			}
			
			
			//eliminamos gae antiguo
			if(resp >= 0){
				resp = gaeDB.eliminarGae(gaeOriginal);
			}
			
			//eliminamos usuario antiguo
			if(resp >= 0){
				resp = usuarioDB.eliminarUsuario(usuarioOrignal);
			}
		}
		else{
			resp = 0;
		
			//actualismos gaeOriginal por gaeNuevo
			if(resp >= 0){
				resp = gaeDB.modificarGae(gaeNuevo);
			}
			
			//eliminamos alumnos pretenecientes al gaeOriginal
			if(resp >= 0){
				for(int i=0;i<gaeOriginal.getListaAlumnosGAE().size();i++){
					resp = alumnoDB.eliminarAlumno(gaeOriginal.getListaAlumnosGAE().get(i));
					if(resp < 1){
						resp = -1;
						break;
					}
				}
			}
			
			//insertamos alumnos eliminados
			if(resp >= 0){
				for(int i=0;i<gaeOriginal.getListaAlumnosGAE().size();i++){
					gaeOriginal.getListaAlumnosGAE().get(i).setId_curso(gaeOriginal.getId_curso());
					resp = alumnoDB.insertarAlumno(gaeOriginal.getListaAlumnosGAE().get(i));
					if(resp < 1){
						resp = -1;
						break;
					}
				}
			}
			
			//asociamos alumnos al gae
			if(resp >= 0){
				for(int i=0;i<gaeNuevo.getListaAlumnosGAE().size();i++){
					gaeNuevo.getListaAlumnosGAE().get(i).setId_curso(gaeOriginal.getId_curso());
					resp = alumnoDB.asignarAlumnoGae(gaeNuevo, gaeNuevo.getListaAlumnosGAE().get(i));
					if(resp < 1){
						resp = -1;
						break;
					}
				}
			}
			
			//Asignamos al nuevo alumno representante.
			if(resp >= 0){
				resp = alumnoDB.asignarAlumnoRepresentante(gaeNuevo);
			}
		}
		if(resp > 0){
			this.connection.commit();
		}else{
			this.connection.rollback();
		}
		try{
			this.connection.getConnection().close();
		}catch (SQLException e){
			e.printStackTrace();
		}
		return resp;
	}

	public int eliminarGae(GaeTO gae) {
		int resp = -1;
		this.connection.setAutoCommit(false);
		
		IUsuario usuarioDB = new UsuarioDB(this.connection.getConnection());
		IProducto productoDB = new ProductoDB(this.connection.getConnection());
		IReporte reporteDB = new ReporteDB(this.connection.getConnection());
		IGae gaeDB = new GaeDB(this.connection.getConnection());
		IAlumno alumnoDB = new AlumnoDB(this.connection.getConnection());
		IPautaEvaluacion pautaEvaluacionDB = new PautaEvaluacionDB(this.connection.getConnection());
		
		//eliminamos todos los productos asociados al gae
		resp = productoDB.eliminarTodosProductosGae(gae);
		
		//eliminar todos los reportes asociados al gae
		if(resp >= 0){
			resp = reporteDB.eliminarTodosReportesGae(gae);
		}
		
		//eliminamos todas las pautas de evaluaciones
		if(resp >= 0){
			resp = pautaEvaluacionDB.eliminarPautaEluacionGAE(gae.getId_gae(),gae.getRut_gae());
		}
		
		//eliminar alumnos
		if(resp >= 0){
			for(int i=0;i<gae.getListaAlumnosGAE().size();i++){
				resp = alumnoDB.eliminarAlumno(gae.getListaAlumnosGAE().get(i));
				if(resp < 1){
					resp = -1;
					break;
				}
			}
		}
		
		//insertar alumnos eliminados
		if(resp > 0){
			for(int i=0;i<gae.getListaAlumnosGAE().size();i++){
				resp = alumnoDB.insertarAlumno(gae.getListaAlumnosGAE().get(i));
				if(resp < 1){
					resp = -1;
					break;
				}
			}
		}
		
		//Eliminamos gae
		if(resp > 0){
			resp = gaeDB.eliminarGae(gae);
		}
		
		//eliminar cuenta usuario
		if(resp > 0)
		{
			UsuarioTO usr = new UsuarioTO();
			usr.setRut(gae.getRut_gae());
			resp = usuarioDB.eliminarUsuario(usr);
		}
		
		if(resp > 0){
			this.connection.commit();
		}else{
			this.connection.rollback();
		}
		try{
			this.connection.getConnection().close();
		}catch (SQLException e){
			e.printStackTrace();
		}
		return resp;
	}
	
	public int modificarPerfilGae(GaeTO gae, UsuarioTO usuario)
	{
		int resp = -1;
		AlumnoTO alumno = new AlumnoTO();
		
		this.connection.setAutoCommit(false);
		
		IUsuario usuarioDB = new UsuarioDB(this.connection.getConnection());
		IGae gaeDB = new GaeDB(this.connection.getConnection());
		IAlumno alumnoDB = new AlumnoDB(this.connection.getConnection());
		
		resp = usuarioDB.modificarUsuario(usuario);
		
		if(resp > 0)
			resp = gaeDB.modificarGae(gae);
		
		alumno.setMatricula(gae.getMatriculaRepresentante());
		alumno.setId_curso(gae.getId_curso());
		alumno.setId_gae(gae.getId_gae());
		alumno.setRut_gae(gae.getRut_gae());
		alumno.setNombre(gae.getNombreRepresentante());
		alumno.setApellido(gae.getApellidoRepresentante());
		alumno.setTipo_fono(gae.getTipo_fono());
		alumno.setFono(gae.getFono());
		alumno.setCorreo(gae.getCorreo());
		
		if(resp > 0)
			resp = alumnoDB.modificarPerfilAlumno(alumno);
		
		if(resp > 0){
			this.connection.commit();
		}else{
			this.connection.rollback();
		}
		try{
			this.connection.getConnection().close();
		}catch (SQLException e){
			e.printStackTrace();
		}
		
		return resp;
	}

	public List<GaeTO> obtenerGaesCurso(CursoTO curso)
	{
		List<GaeTO> listaGrupos = new ArrayList<GaeTO>();
		IGae gaeDB = new GaeDB(this.connection.getConnection());
		
		listaGrupos = gaeDB.obtenerGaesCurso(curso);
		
		this.closeConnection();		
		return listaGrupos;
	}
	
	public List<GaeTO> obtenerGaesCursoAsociados(CursoTO curso)
	{
		List<GaeTO> listaGrupos = new ArrayList<GaeTO>();
		IGae gaeDB = new GaeDB(this.connection.getConnection());
		
		listaGrupos = gaeDB.obtenerGaesCursoAsociados(curso);
		
		this.closeConnection();		
		return listaGrupos;
	}
	
	public List<GaeTO> obtenerGaesCursoNoAsociados(CursoTO curso)
	{
		List<GaeTO> listaGrupos = new ArrayList<GaeTO>();
		IGae gaeDB = new GaeDB(this.connection.getConnection());
		
		listaGrupos = gaeDB.obtenerGaesCursoNoAsociados(curso);
		
		this.closeConnection();		
		return listaGrupos;
	}
	
	public List<GaeTO> obtener_gaes_asociados_a_un_proyecto_X(ProyectoTO proyecto)
	{
		List<GaeTO> listaGrupos = null;
		IGae gaeDB = new GaeDB(this.connection.getConnection());
		
		listaGrupos = gaeDB.obtener_gaes_asociados_a_un_proyecto_X(proyecto);
		
		this.closeConnection();		
		return listaGrupos;
	}
	
	public int asignarProyectoGae(ProyectoTO proyecto, GaeTO gae) {
		 
		int resp = -1;
		
		this.connection.setAutoCommit(false);
		
		IGae gaeDB = new GaeDB(this.connection.getConnection());
		IPautaEvaluacion pautaEvaluacionDB = new PautaEvaluacionDB(this.connection.getConnection());
		
		//VERIFICAMOS SE EL PROYECTO TIENE ASOCIADO UN RUT_SOCIO
		//EN CASO DE SER VALIDO DEBEMOS CREAR LA PAUTA DE EVALUACION
		if(proyecto.getRut_socio()!=0){
			SocioTO socio = new SocioTO();
			socio.setRut_socio(proyecto.getRut_socio());
			
			//CREAMOS LAS 2 PAUTAS
			resp = pautaEvaluacionDB.crearPautaEvaluacion(socio, gae);
			if (resp > 0)
				resp = pautaEvaluacionDB.crearPautaEvaluacion(socio, gae);
			
			if(resp > 0)
				resp = gaeDB.asignarProyectoGae(proyecto, gae);
		}
		else{
			resp = gaeDB.asignarProyectoGae(proyecto, gae);
		}	
		
		if(resp > 0){
			this.connection.commit();
		}
		else{
			this.connection.rollback();
			resp = -1;
		}
	
		try{
			this.connection.getConnection().close();
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		
		return resp;
	}
	
	public int desAsignarProyectoGae(ProyectoTO proyecto, GaeTO gae){
		int resp = -1;
		//PautaEvaluacionTO pauta = null;
		List<PautaEvaluacionTO> pautas = new ArrayList<PautaEvaluacionTO>();
		
		this.connection.setAutoCommit(false);
		
		IGae gaeDB = new GaeDB(this.connection.getConnection());
		IPautaEvaluacion pautaEvaluacionDB = new PautaEvaluacionDB(this.connection.getConnection());
		
		//PRIMERO VERIDICAMOS SI EXISTE ALGUNA PAUTA QUE POSEA EL ID Y RUT DEL GAE
		//EN CASO DE EXISTIR EST PAUTA DEBE SER ELIMINADA UNA VEZ QUE SE DESASIGNE UN PROYEF
		
		//pauta = pautaEvaluacionDB.obtenerPautaEvaluacionGae(gae);
		pautas = pautaEvaluacionDB.obtenerPautaEvaluacionGae(gae);
		//if(pauta.getId_gae() != -1){
		if(pautas.size() > 0){
			//resp = pautaEvaluacionDB.eliminarPautaEluacionGAE(pauta.getId_gae(), pauta.getRut_gae());
			resp = pautaEvaluacionDB.eliminarPautaEluacionGAE(gae.getId_gae(), gae.getRut_gae());
			if(resp > 0){
				resp = gaeDB.desAsignarProyectoGae(proyecto, gae);
			}
		}
		else{
			resp = gaeDB.desAsignarProyectoGae(proyecto, gae);
		}	
		
		if(resp > 0){
			this.connection.commit();
		}
		else{
			this.connection.rollback();
			resp = -1;
		}
	
		try{
			this.connection.getConnection().close();
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		
		return resp;
	}
	
	
	
	/*////////////////////////////// ESTOS NO DEBERIAN ESTAR AQUI!!!!!!!!!!!!!!! *///////////////////
	public List<AlumnoTO> obtenerAlumnosGae(GaeTO gae)
	{
		List<AlumnoTO> alumnosGae = new ArrayList<AlumnoTO>();
		IAlumno alumnoDB = new AlumnoDB(this.connection.getConnection());
		
		alumnosGae = alumnoDB.obtenerAlumnosGae(gae);
		
		this.closeConnection();		
		return alumnosGae;
	}
}
